#ifndef HASH_TABLE_H
#define HASH_TABLE_H

	#include "chaineChaineEntree.h"
	#include "pileChaineEntree.h"
	#include "../code/genMips.h"
	#include "../code/variableADeclarer.h"
	#include "../code/pourGestionPile.h"
	
	#define HASH_TABLE_SIZE 100
	#define CST_HASH 64
	
	typedef pChaineChaineEntreeNode hashTableIndex;
	
	hashTableIndex hashTable[HASH_TABLE_SIZE];
	
	//renvoie le hash correspondant à la source en paramètre
	unsigned int fctHash(char * source);
	//initialise la hashTable à NULL
	void initHashTable();
	//renvoie 1 si le "index"ieme element de la hashTable n'est pas null
	int existeIndexHashTable(int indexHashTable);
	//renvoie 1 si la clef en paramètre existe déjà dans la hashTable
	int existeMotClefHashTable(char * clef);
	//renvoie 1 si la clef en paramètre existe déjà dans la hashTable hors élément avec cible null
	int existeMotClefHashTableHorsVide(char * clef);
	//renvoie la chaine correspondant au hash passé en paramètre
	pChaineChaineEntreeNode recupLigneHashTable(int indexHashTable);
	//renvoie l'entree correspondante à la clef passée en paramètre. La clef doit exister dnas la hashTable (non null)
	entree consulteHashTable(char * clef);
	//renvoie 1 si la clef existe déjà dans le bloc courant
	int entreeDejaDansBloc(char * nom);
	//ajout de l'entrée dans la hashTable. La clef ne doit pas encore exister dans la hashTable
	void ajoutEntreeHashTable(entree element);
	//entrée dans un nouveau bloc -> ajout en tete de pileBloc + gestion
	void entreeBloc();
	//sortie du bloc courant -> suppression en tete de pileBloc + gestion
	void sortieBloc();
	//modification de la valeur d'une entree constante de type int. l'entree doit exister dans la hashtable
	void majValeurEntiereConstanteEntreeBlocCourant(char * clef, int valeur);
	//modification de la valeur d'une entree constante de type bool. l'entree doit exister dans la hashtable
	void majValeurBoolConstanteEntreeBlocCourant(char * clef, int valeur);
	//modification de la valeur d'une entree constante de type char *. l'entree doit exister dans la hashtable
	void majValeurCharConstanteEntreeBlocCourant(char * clef, char * valeur);
	//rendre fantome une entree
	void fantomiserEntreeBlocCourant(char * clef);
	//affichage d ela hashTable
	void afficheHashTable ();
	//renvoie 1 si aucune ligne de la hashtable n'est remplie => aucun identifiant n'a ete déclaré
	int hashTableVide ();

#endif
